/**
 * @param {number[]} nums
 * @return {number}
 */
/* 
方法思路定义状态：设dp[i]为以第i个元素结尾的最长严格递增子序列的长度。
初始化：每个元素自身可以构成一个长度为 1 的子序列，因此dp数组初始化为全 1。
状态转移方程：对于每个i（从 1 到nums.length-1），遍历所有j（从 0 到i-1），如果nums[j] < nums[i]，则说明可以将第i个元素接在以第j个元素结尾的子序列后面，形成一个更长的子序列。此时，dp[i]可以更新为dp[j] + 1。我们需要遍历所有可能的j，取最大值：
\(dp[i] = \max(dp[i], dp[j] + 1) \quad \text{其中} \quad 0 \leq j < i \quad \text{且} \quad nums[j] < nums[i]\)结果：整个数组的最长严格递增子序列的长度为dp数组中的最大值。

代码解释
初始化 DP 数组：创建一个长度为n的数组dp，并将所有元素初始化为 1，表示每个元素自身构成一个长度为 1 的子序列。
遍历数组：从第二个元素开始遍历每个元素i，对于每个i，再遍历其前面的所有元素j。
更新 DP 值：如果nums[j] < nums[i]，说明可以将第i个元素接在以第j个元素结尾的子序列后面，更新dp[i]为dp[j] + 1和当前dp[i]中的较大值。
返回结果：返回dp数组中的最大值，即为最长严格递增子序列的长度。
*/
var lengthOfLIS = function (nums) {
  if (nums.length === 0) return 0;

  const n = nums.length;
  const dp = new Array(n).fill(1); // 初始化dp数组为全1

  for (let i = 1; i < n; i++) {
    for (let j = 0; j < i; j++) {
      if (nums[j] < nums[i]) {
        dp[i] = Math.max(dp[i], dp[j] + 1);
      }
    }
  }

  return Math.max(...dp); // 返回dp数组中的最大值
};